#ifndef BASE_NATTYPE_H__
#define BASE_NATTYPE_H__

namespace base {

	/* Identifies each type of NAT that can be simulated. */
	enum NATType {
		NAT_OPEN_CONE,
		NAT_ADDR_RESTRICTED,
		NAT_PORT_RESTRICTED,
		NAT_SYMMETRIC
	};

	// Implements the rules for each specific type of NAT.
	class NAT {
	public:
		virtual ~NAT() { }

		// Determines whether this NAT uses both source and destination address when
		// checking whether a mapping already exists.
		virtual bool IsSymmetric() = 0;

		// Determines whether this NAT drops packets received from a different IP
		// the one last sent to.
		virtual bool FiltersIP() = 0;

		// Determines whether this NAT drops packets received from a different port
		// the one last sent to.
		virtual bool FiltersPort() = 0;

		// Returns an implementation of the given type of NAT.
		static NAT* Create(NATType type);
	};

} // namespace base

#endif // BASE_NATTYPE_H__
